package br.com.lojapi.dao;

import br.com.lojapi.bean.Endereco;
import br.com.lojapi.bean.Pessoa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Aluno
 */
public class EnderecoDAOImp implements EnderecoDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        Pessoa pessoa = (Pessoa) obj;
        PreparedStatement ps = null;
        Connection conn = null;

        try {
            String SQL = "INSERT INTO endereco(rua, numero, bairro, cidade, estado, pais, idPessoa) "
                    + "VALUES(?, ?, ?, ?, ?, ?, ?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, pessoa.getEndereco().getRua());
            ps.setString(2, pessoa.getEndereco().getNumero());
            ps.setString(3, pessoa.getEndereco().getBairro());
            ps.setString(4, pessoa.getEndereco().getCidade());
            ps.setString(5, pessoa.getEndereco().getEstado());
            ps.setString(6, pessoa.getEndereco().getPais());
            ps.setInt(7, pessoa.getId());
            ps.executeUpdate();

        } catch (SQLException se) {
            throw new Exception("Erro ao tentar inserir dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn);
        }
        return pessoa;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        Pessoa pessoa = (Pessoa) obj;
        PreparedStatement ps = null;
        Connection conn = null;

        try {
            String SQL = "UPDATE endereco SET rua=?, numero=?, bairro=?, cidade=?, estado=?, pais=? WHERE idPessoa=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, pessoa.getEndereco().getRua());
            ps.setString(2, pessoa.getEndereco().getNumero());
            ps.setString(3, pessoa.getEndereco().getBairro());
            ps.setString(4, pessoa.getEndereco().getCidade());
            ps.setString(5, pessoa.getEndereco().getEstado());
            ps.setString(6, pessoa.getEndereco().getPais());
            ps.setInt(7, pessoa.getId());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String SQL = "DELETE FROM endereco WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar excluir dados no endereço"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Endereco endereco = null;
        try {
            String SQL = "SELECT * FROM endereco WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                endereco = new Endereco();
                endereco.setId(id);
                endereco.setRua(rs.getString("rua"));
                endereco.setNumero(rs.getString("numero"));
                endereco.setBairro(rs.getString("bairro"));
                endereco.setCidade(rs.getString("cidade"));
                endereco.setEstado(rs.getString("estado"));
                endereco.setPais(rs.getString("pais"));
            }
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados de endereço"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return endereco;
    }

    @Override
    public List<Object> listar() throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs;
        Endereco endereco;
        List enderecos = new ArrayList();
        try {
            String SQL = "SELECT * FROM endereco";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();

            while (rs.next()) {
                endereco = new Endereco();
                endereco.setId(rs.getInt("id"));
                endereco.setRua(rs.getString("rua"));
                endereco.setNumero(rs.getString("numero"));
                endereco.setBairro(rs.getString("bairro"));
                endereco.setCidade(rs.getString("cidade"));
                endereco.setEstado(rs.getString("estado"));
                endereco.setPais(rs.getString("pais"));
            }
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar listar dados no endereco"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return enderecos;
    }
}